﻿//9. 排序整形数组
//9.1 题⽬描述：
//输⼊10个整数，然后使⽤冒泡排序对数组内容进⾏升序排序，然后打印数组的内容
//测试1：
//输⼊：10 9 8 7 6 5 4 3 2 1
//输出：1 2 3 4 5 6 7 8 9 10
//测试2：
//输⼊：1 3 2 4 5 7 6 8 10 9
//输出：1 2 3 4 5 6 7 8 9 10

// 思路整理；
//1.输入十个整数，for循环
//2.判断数值大小，直到从左往右依次增大则停止！
//  怎样实现升序呢？
//  上一个实现了最大和最小的，那能不能把最小的保留，然后依次打印出来，每次判断一个，紧接着在数组中去那个数字，直到所有数字被判断完

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//            !!!!!!!!!!!!!!!!!!!!                       已经成功找出最小数

//int main()
//{
//	int i = 0;
//	printf("请输入十个数字，由我来实现升序操作（从左往右依次增大）\n");
//	int arr [10] = {0 };
//	int arr2[10] = { 0 };
//	for (i = 0;i < 10;i++)
//	{
//		scanf("%d", &arr[i]);//         记得要将数存储到【i】中去！！！
//    }
//	for (i = 0;i < 10;i++)
//	{
//		int min = arr[0];
//		for (i = 0;i < 10;i++)
//		{
//			if (arr[i] < min)
//			{
//				min = arr[i];
//
//			}
//		}
//		printf("%d", min);
//	}
//	return   0;
//
//}
//
//
//
//
//// ！！！！！！！！！！！！！！！！！       秘塔的思路
//
//#include <limits.h>
//int main()
//{
//    int original[10], sorted[10];
//    printf("请输入十个数字：\n");
//
//    // **输入10个整数**
//    for (int i = 0; i < 10; i++)
//    {
//        scanf("%d", &original[i]);
//    }
//
//    // **复制原数组用于操作**
//    int temp[10];
//    for (int i = 0; i < 10; i++)
//    {
//        temp[i] = original[i];
//    }
//
//    // **每次找最小值存入sorted[]**
//    for (int i = 0; i < 10; i++)
//    {
//        int min_index = 0;
//
//        // **找到当前未处理部分的最小值**
//        for (int j = 1; j < 10; j++) 
//        {
//            if (temp[j] < temp[min_index])
//            {
//                min_index = j;
//            }
//        }
//
//        sorted[i] = temp[min_index]; // **存入新数组**
//        temp[min_index] = INT_MAX; // **标记已处理（不再选它）**
//    }
//
//    // **打印排序后的数组**
//    printf("升序排序结果：");
//    for (int i = 0; i < 10; i++) 
//    {
//        printf("%d ", sorted[i]);
//    }
//    printf("\n");
//
//    return 0;
//}
//
//
//
//
//#include <stdio.h>
//#include <limits.h> // INT_MAX
//
//int main()
//{
//    int arr[10];
//
//    printf("请输入十个数字：\n");
//
//    // ✅ Step1:输入数据
//    for (int i = 0; i < 10; i++) 
//    {
//        scanf("%d", &arr[i]);
//    }
//
//    printf("升序排列结果：");
//
//    // ✅ Step2:循环10次，每次找当前最小值并排除它
//    for (int k = 0; k < 10; k++) 
//    {
//        int min_val = INT_MAX;
//        int min_index = -1;
//
//        // 🔍 Step2.1:遍历整个数组找当前最小值
//        for (int i = 0; i < 10; i++) 
//        {
//            if (arr[i] < min_val) 
//            {
//                min_val = arr[i];
//                min_index = i;
//            }
//        }
//
//        // 🖨️ Step2.2:打印当前最小值
//        printf("%d ", min_val);
//
//        // ❌ Step2.3:标记这个数为“已处理”（避免下次再选）
//        arr[min_index] = INT_MAX;
//    }
//
//    return  0;
//}
//
//
//#include <stdio.h>
//#include <limits.h>
//
//int main() {
//    int original[10], sorted[10];
//
//    printf("请输入十个数字：\n");
//
//    // ✅ Step1:输入数据
//    for (int i = 0; i < 10; i++) 
//    {
//        scanf("%d", &original[i]);
//    }
//
//    // ✅ Step2:每次找最小值存入sorted[]
//    for (int k = 0; k < 10; k++) 
//    {
//        int min_val = INT_MAX;
//
//        // 🔍 Step2.1:遍历原数组找当前最小值
//        for (int i = 0; i < 10; i++)
//        {
//            if (original[i] < min_val) 
//            {
//                min_val = original[i];
//            }
//        }
//
//        sorted[k] = min_val; // ✅存入新数组
//
//        // ❌ Step2.2:在原数组中标记该值为“已处理”
//        for (int i = 0; i < 10; i++) 
//        {
//            if (original[i] == min_val)
//            {
//                original[i] = INT_MAX;
//                break;
//            }
//        }
//    }
//
//    // 🖨️ Step3:打印结果
//    printf("升序排列结果：");
//    for (int i = 0; i < 10; i++) 
//    {
//        printf("%d ", sorted[i]);
//    }
//
//    return  0;
//}


//INT_MAX的含义和用法
//📌 INT_MAX是什么？
//INT_MAX是C语言标准库中定义的一个宏常量（定义在 <limits.h>头文件中）
//INT_MAX表示当前系统中 int类型能存储的最大正整数值
//📌 INT_MAX的典型值：
//⚙️32位系统上通常是2147483647(即2³¹ - 1)
//⚙️64位系统上通常也是2147483647(因为标准规定至少16位)
//📌在您代码中的作用：
//int min_val = INT_MAX;
//👉这里把 min_val初始化为最大可能的整数值，确保数组中任何一个数都会比它小
//
//📌标记"已处理"的用法：
//original[i] == INT_MAX;
//👉这里把已经找到的最小值设为 INT_MAX作为标记：
//
//✅下次查找时会被自动跳过(因为要找比当前min_val小的数)
//✅相当于"排除"了已经处理过的元素
//📌为什么不用其他值？
//❌用特殊值如 - 999可能和真实数据冲突
//❌用变量存储会增加复杂度
//✅用 INT_MAX既安全又明确
//📌注意事项：
//⚠️如果所有元素都是 INT_MAX会导致逻辑错误(但您的场景不会)
//⚠️极端情况下如果输入包含 INT_MAX会影响算法(但题目保证输入是普通整数)




//             自己打一遍
#include <limits.h>
int main()
{
    printf("请输入十个数，由我来实现升序排列（从左往右依次增大）\n");
    int i = 0;
    int original[10] = { 0 };
     //输入十个数
    for (i = 0;i < 10;i++)
    {
        scanf("%d", &original[i]);
    }
    //要查找最小数
    //（判断并且及时更新需要复制一个数组）
    int duplicate[10] = { 0 };//duplicate||replica艺术品
    for (i = 0;i < 10;i++)
    {
        duplicate[i] = original[i];
    }
    int end_min[10] = { 0 };
    for (i = 0;i < 10;i++)
    {
        int min_dex = 1;//一个初始值引起的变化！！！！
        int j = 0;
        for (j = 0;j < 10;j++)
        {
            if (duplicate[j] < duplicate[min_dex])
            {

                min_dex = j;
            }
        }
        end_min[i] = duplicate[min_dex];
        duplicate[min_dex] = INT_MAX;
    }
    printf("升序结果如下\n");
    for (i = 0;i < 10;i++)
    {
        printf("%d\n", end_min[i]);
    }


    return 0;
}




//#include <stdio.h>
//#include <limits.h>
//
//int main() {
//    printf("请输入十个数，由我来实现升序排列（从左往右依次增大）\n");
//    int original[10] = { 0 };
//
//    // 输入十个数
//    for (int i = 0; i < 10; i++) {
//        scanf("%d", &original[i]);
//    }
//
//    int duplicate[10] = { 0 };
//    for (int i = 0; i < 10; i++) {
//        duplicate[i] = original[i];
//    }
//
//    int end_min[10] = { 0 };
//    for (int i = 0; i < 10; i++) {
//        // 找到第一个未被处理的元素作为初始 min_dex
//        int min_dex = -1;
//        for (int j = 0; j < 10; j++) {
//            if (duplicate[j] != INT_MAX) {
//                min_dex = j;
//                break;
//            }
//        }
//        if (min_dex == -1) break; // 所有元素已处理
//
//        // 查找当前最小值
//        for (int j = 0; j < 10; j++) {
//            if (duplicate[j] != INT_MAX && duplicate[j] < duplicate[min_dex]) {
//                min_dex = j;
//            }
//        }
//
//        end_min[i] = duplicate[min_dex];
//        duplicate[min_dex] = INT_MAX; // 标记为已处理
//    }
//
//    printf("升序结果如下\n");
//    for (int i = 0; i < 10; i++) {
//        printf("%d ", end_min[i]);
//    }
//
//    return 0;
//}
